package com.xhis.homenurse;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import androidx.core.content.FileProvider;
import android.util.Log;

import com.xhis.homenurse.models.Base_out;
import com.xhis.homenurse.tools.DownFileByWebRequest;
import com.xhis.homenurse.tools.ExceptionProcess;
import com.xhis.homenurse.webservice.api.WSHttpRequest;

import java.io.File;
import java.net.URLEncoder;

import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

/**
 * 程序更新
 * Created by 张兵 on 2019/7/16.
 */
public class AppUpdaterNew
{
    //Rx
    protected Subscription mSubscription;
    private Context context;

    public AppUpdaterNew(Context c) {
        context = c;
    }

    public Subscription getSubscription() {
        return mSubscription;
    }

    /**
     * 校验
     * checkType 区分不同更新区域 0启动页 1设置页 2服务
     */
    public void checkVersion(final int checkType)
    {
        // 获取版本代码
        PackageInfo info;
        try {
            info = context.getPackageManager().getPackageInfo(
                    context.getPackageName(), 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            GLobalApp.showMessageDialog(context, "获取程序版本号失败。");
            return;
        }

        String version = info.versionName;
        String sbId = GLobalApp.getSerialNumber(context);
        if (sbId == null || sbId.equals("")) {
            GLobalApp.showMessageDialog(context, "读取MAC地址失败。");
            // return;
        }

        //判断是否需要更新，不需要传参，直接请求
        mSubscription = WSHttpRequest.getWsRequestApi_Gson().sendGetVersionInfo("")
                .subscribeOn(Schedulers.io())
                //指定回调在哪执行
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Base_out>()
                {
                    @Override
                    public void onCompleted()
                    {
                        Log.e("AppUpdate", "AppUpdate---onCompleted---");
                    }

                    @Override
                    public void onError(Throwable throwable)
                    {
                        Log.e("AppUpdate", "AppUpdate---onError---" + ExceptionProcess.getThrowableMessage(throwable));
                        switch (checkType) {
                            case 0:
                                ((FlashActivity) context).onFailure(ExceptionProcess.getThrowableMessage(throwable));
                                break;
                        }
                    }

                    @Override
                    public void onNext(Base_out base_out)
                    {
                        Log.e("AppUpdate", "AppUpdate---onNext---");
                        switch (checkType) {
                            case 0:
                                ((FlashActivity) context).onSuccess(base_out);
                                break;
                        }
                    }
                });
    }

    /**
     * 下载新版本
     */
    public void download(String url, Handler handler) {
        try {
            String filePath = getSavePath();
            if (filePath == null)
                return;
            File file = new File(filePath);
            deleteFile(file); // 文件夹存在删除
            if (!file.exists())
                file.mkdirs(); // 文件夹不存在则创建
            Log.v("download", "start");
            // 获取下载文件名
            String name = url.substring(url.lastIndexOf("/") + 1);
            // 编码url文件名
            url = url.substring(0, url.lastIndexOf("/") + 1)
                    + URLEncoder.encode(name, "GBK");
            // 本地文件全名
            String fullName = filePath + "/" + name;
            Log.v("download", url);
            DownFileByWebRequest.DownFile(url, fullName);
            // Android获取一个用于打开文件的intent，下载完成后提示安装；
            Intent intent = new Intent();
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setAction(Intent.ACTION_VIEW);

            // 判断是否是7.0
            if (Build.VERSION.SDK_INT >= 24) {
                // 适配android7.0 ，不能直接访问原路径
                // 需要对intent 授权
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                intent.setDataAndType(FileProvider.getUriForFile(context, "com.xhis.homenurse", new File(fullName)), "application/vnd.android.package-archive");
            } else {
                intent.setDataAndType(Uri.fromFile(new File(fullName)), "application/vnd.android.package-archive");
            }
            // 传递过来的Handler对象；
            if (handler != null) {
                Message mes = new Message();
                mes.arg1 = 0;
                mes.obj = intent;
                handler.sendMessage(mes);
            }
        } catch (Exception e) {
            if (handler != null) {
                Message mes = new Message();
                mes.arg1 = 1;
                mes.obj = e.getMessage();
                handler.sendMessage(mes);
            }
            e.printStackTrace();
        }
    }

    /**
     * 获取文件保存地址
     */
    private String getSavePath() throws Exception {
        // 判断sd卡是否存在
        boolean sdCardExist = Environment.MEDIA_MOUNTED.equals(Environment
                .getExternalStorageState());
        if (sdCardExist) {
            File sdDir = Environment.getExternalStorageDirectory();// 获取根目录
            return sdDir.toString() + "/xhis/homenurse/update";
        }
        throw new Exception("没有找到sd卡");
        // else
        // {
        // //内部存储地址
        // File file=context.getDir("update", Context.MODE_PRIVATE);
        // String path=file.getAbsolutePath();
        //
        // deleteFile(new File(path));
        //
        // return "/data/data/com.xxhis.homenurse/files";
        // }
    }

    /**
     * 删除文件夹所有内容
     */
    private void deleteFile(File file) {
        try {
            if (file.exists()) { // 判断文件是否存在
                if (file.isFile()) { // 判断是否是文件
                    file.delete(); // delete()方法 你应该知道 是删除的意思;
                } else if (file.isDirectory()) { // 否则如果它是一个目录
                    File files[] = file.listFiles(); // 声明目录下所有的文件 files[];
                    for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件
                        this.deleteFile(files[i]); // 把每个文件 用这个方法进行迭代
                    }
                }
                file.delete();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
